﻿/**
* 线条基类。
*/
Ext.define('Happy.designer.Line', {
    requires: ['Happy.designer.PointUtil'],

    /**
     * @cfg {Object} 默认线条配置。
     */
    defaultLineConfig: {
        stroke: '#000',
        'stroke-width': 2
    },

    constructor: function (drawer, config) {
        var me = this;

        me.drawer = drawer;

        me.initLine(config);
    },

    /**
     * 创建演示线条。
     * 
     * @private
     * @param {Object} config
     */
    initLine: function (config) {
        var me = this;

        var path = me.createLineAndArrawPath(config);

        var lineConfig = Ext.applyIf({
            type: 'path',
            path: path.linePath
        }, config);
        Ext.applyIf(lineConfig, me.defaultLineConfig);
        me.line = me.drawer.surface.add(lineConfig);
        me.line.show(true);

        var arrawConfig = Ext.applyIf({
            type: 'path',
            path: path.arrawPath
        }, config);
        Ext.applyIf(arrawConfig, me.defaultLineConfig);
        Ext.apply(arrawConfig, { fill: arrawConfig.stroke });
        me.arraw = me.drawer.surface.add(arrawConfig);
        me.arraw.show(true);
    },

    /**
     * 创建线条和箭头路径。
     * 
     * @private
     * @param {Object} config
     * @return {Object}
     */
    createLineAndArrawPath: function (config) {
        var me = this;

        config.start = me.getStartPoint(config);
        config.end = me.getEndPoint(config);

        var linePath = me.createLinePath(config);
        var arrawPath = me.createArrawPath(config);

        delete config.start;
        delete config.end;
        delete config.startCycle;
        delete config.endCycle;

        return {
            linePath: linePath,
            arrawPath: arrawPath
        };
    },

    /**
     * 创建线条路径。
     * 
     * @protect
     * @param {Object} config
     * @return {String} 径路
     */
    createLinePath: Ext.emptyFn,

    /**
     * 创建箭头路径。
     * 
     * @protect
     * @param {Object} config
     * @return {String} 径路
     */
    createArrawPath: Ext.emptyFn,

    /**
     * 修改线条配置。
     * 
     * @public
     * @param {Object} config
     */
    setLineAttributes: function (config) {
        var me = this;

        var path = me.createLineAndArrawPath(config);

        var lineConfig = Ext.applyIf({
            path: path.linePath
        }, config);
        me.line.setAttributes(lineConfig, true);

        var arrawConfig = Ext.applyIf(config, {
            path: path.arrawPath
        });
        me.arraw.setAttributes(arrawConfig, true);
    },

    /**
     * 移除线条。
     * 
     * @public
     */
    removeLine: function () {
        var me = this;

        me.line.remove();
        me.arraw.remove();
    },

    /**
     * 返回开始点。
     * 
     * @private
     * @param {Object} config
     * @return {Object}
     */
    getStartPoint: function (config) {
        return {
            x: config.startCycle.attr.x,
            y: config.startCycle.attr.y
        };
    },

    /**
     * 返回结束点。
     * 
     * @private
     * @param {Object} config
     * @return {Object}
     */
    getEndPoint: function (config) {
        if (config.endCycle) {
            return {
                x: config.endCycle.attr.x,
                y: config.endCycle.attr.y
            };
        }

        return config.end;
    }
});